package com.javaNetExercise.chapter12;


import java.net.*;

public class UDPClient {


    public static void main(String[] args) {


        try {
            // 创建UDP套接字
            DatagramSocket clientSocket = new DatagramSocket();

            // 创建要发送的数据
            String message = "Hello, UDP!";
            byte[] sendData = message.getBytes();

            // 指定服务器地址和端口
            InetAddress serverAddress = InetAddress.getByName("localhost");
            int serverPort = 8080;

            // 创建数据报和 连接,  UDP不是无连接的吗? 为啥还有 连接呢?  这个connect()方法不是真连接，它是为了在客户端的DatagramSocket实例中保存服务器端的IP和端口号，确保这个DatagramSocket实例只能往指定的地址和端口发送UDP包，不能往其他地址和端口发送。这么做不是UDP的限制，而是Java内置了安全检查。
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, serverPort);

            // 发送数据报
            clientSocket.send(sendPacket);


            // 接收服务端
            byte[] buffer = new byte[1024];
            sendPacket = new DatagramPacket(buffer, buffer.length);
            clientSocket.setSoTimeout(1000);
            clientSocket.connect(InetAddress.getByName("localhost"), 8080); // 连接指定服务器和端口, 当然前面已经连接了, 这里重复无所谓, 但是 url 和 port 不能错, 否则异常
            clientSocket.receive(sendPacket);
            String resp = new String(sendPacket.getData(), sendPacket.getOffset(), sendPacket.getLength());
            System.out.println(resp);
            clientSocket.disconnect();
            // 关闭UDP套接字
            clientSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
